Scaricare e installare i seguenti applicativi rispettando l’ordine d’installazione:
Creare un account personale su [GitHub] (https://github.com/)
Installare i seguenti pacchetti che saranno utilizzati nel corso, copiando e incollando nella consolle di R questa istruzione:
install.packages(c("tidyverse", "readxl", "here", "janitor", "openxlsx", "gt", "knit", "rmarkdown"))Usando il seguente comando
file.edit("~/.Rprofile")si aprirà il file .Rprofile in RStudio. Procedere copiando nel file le seguenti istruzioni
library(here)
#funzione che inizializza un progetto
rproj <- function(){
dir.create("R")
dir.create("dati")
dir.create("report")
file.create(here("R", "codiciOF.R"))
file.create(here("report", "notebook.rmd"))
fileConn<-file(here("report","notebook.rmd"))
writeLines(c("---",
"title: 'R Notebook'",
"output: html_notebook",
"---",
"",
"```{r}",
"source(here('R', 'librerie.R'))",
"```",
"# CAPITOLO",
"## Paragrafo",
"### Subparagrafo",
"#### Subsubparagrafo"), fileConn)
close(fileConn)
file.create(here("R", "librerie.R"))
fileConn2<-file(here("R","librerie.R"))
writeLines(c("library(tidyverse)",
"library(openxlsx)",
"library(readxl)"), fileConn2)
close(fileConn2)
fileConn3 <- file(here("R", "codiciOF.R"))
writeLines(c("source(here('R', 'librerie.R'))"), fileConn3)
close(fileConn3)
}Salvare e chiudere il file .Rprofile
Ora R è configurato in modo che ogni volta sarà aperto richiamerà la libreria “here” e renderà disponibile nell’ambiente globale la funzione rproj.R che potrà essere utilizzata per inizializzare nuovi progetti, come descritto nel prossimo paragrafo.
I nuovi progetti vanno inizializzati dapprima nel repository github e poi clonati sul PC locale.
Aprite il sito GitHub e accedete con login e pwd. Cliccate su “New Repository”. Proseguite dando un nome al repository seguendo i suggerimenti. Scrivete una piccola descrizione dei contenuti del progetto. Selezionate “Private” per rendere privato il contenuto del repository ( questa scelta influenzerà l’eventuale attività di scrittura collaborativa, ma potrà essere modificata anche in un secondo tempo a seconda delle necessità). Mettete la spunta su “ADD a Readme file”. Concludete l’operazione cliccando sul pulsante verde “Create repository”.
A questo punto avete creato un contenitore vuoto che ospiterà in seguito i file del progetto di cui volete garantire il controllo delle versioni, il costante aggioranamento e una sicura archivazione nel cloud.
Copiate dalla barra degli indirizzi della pagina del nuovo repository l’indirizzo web che dovrebbe avere questa forma: https://github.com/Utente/Progetto. Aprite RStudio e create un nuvo progetto utilizzando il comando New Project dal menu a tendina File. Scegliete l’opzione Version Control nella finestra di Dialogo dei nuovi progetti e quindi l’opzione Git. Incollate nella barra Repository URL l’indirizzo del repository del progetto precedentemente copiata. Nella barra Project directory name inserite il nome del Progetto e in Create project as subdirectory of: inserite il percorso della cartella Rprogetti presente nel desktop e che avete creato nel passo 6 delle istruzioni sopra. A questo punto cliccate il pulsante Create Project e R procederà a creare un nuova cartella in Rprogetti denominandola con il nome del progetto e all’interno clonerà i file presenti nel repository. Questa operazione si conclude con R che apre RStudio all’interno del nuovo progetto. Nel Pannello in basso a destra sotto la finestra file potrete visionare i file presenti nel progetto. In questa fase nella cartella del progetto non ci sono ancora le cartelle e i file tipici di un progetto R. Quindi eseguite la funzione rproj() semplicemnte scrivendo nella consolle di R l’istruzione rproj(). La funzione creerà nella cartella del progetto le seguenti cartelle:
R che contiene il file codiciOF.R in cui scrivere i codici di R, il file librerie.R con un elenco delle librerie di base da caricare
dati vuota, che ospiterà i dati del progetto
report che contiene il file notebook.rmd già con una configurazione di base per l’utilizzo come documento di reportistica dei risultati
Panoramica su R e sulle funzionalità di RSTUDIO e GIT
Project in RStudio
Pacchetti di R
Concetti di base di R:
- R base;
- enviroment;
- oggetti;
- vettori;
- liste;
- dataframe;
- tipi di dati (character, double, numeric, factor, integer);
- cenni di programmazione funzionale E’ stata presentata una rapida panoramica
sulle principali funzionalità di RStudio come ambiente di sviluppo con
particolare attenzione al concetto di Project.
Derivato da S, sviluppato ai laboratori Bell dal finire degli anni ’70, R è un linguaggio particolarmente pensato per l’analisi statistica, la simulazione e la rappresentazione grafica dei dati. È un sistema flessibile, che può essere adattato a produrre esattamente l’analisi voluta, che mette a disposizione strumenti analitici moderni. Possiede, fra l’altro:
• Strumenti per la manipolazione e l’archiviazione dei dati • Una collezione estesa, coerente ed estensibile di strumenti analitici • Strumenti grafici per l’analisi e la rappresentazione dei dati • È un linguaggio di programmazione semplice ma potente (gran parte di R è scritta in R stesso)
R è spesso descritto come un ambiente per lavorare con i dati: questo è in contrasto con l’idea di software, che identifica invece una raccolta di strumenti specifici. R non è strettamente un sistema statistico ma dispone di molte procedure statistiche, classiche e moderne, come parte di un sistema di strumenti più ampio. Questa è una importante differenza fra R e altri sistemi statistici. In R una analisi statistica è normalmente eseguita come sequenza di passi intermedi, i cui risultati sono racchiusi in oggetti. Sistemi come SPSS o SAS forniscono outcomes copiosi da (per esempio) una analisi di regressione, mentre l’output di R è in genere minimale ed i risultati dell’analisi vengono invece ritenuti in oggetti accessibili ad ulteriori analisi, interrogazioni, manipolazioni o rappresentazioni grafiche. Questo significa che R può essere adattato a produrre esattamente l’analisi ed i risultati che uno desidera invece di produrre una analisi pre-confezionata per tutte le situazioni.
R è basato su un linguaggio e questo comporta che tipicamente l’interazione con R avvenga attraverso la digitazione di istruzioni in una specifica console ( linea di comando) e significa anche che ogni passo della manipolazione e dell’analisi dei dati può essere registrato, editato, perfezionato (se necessario) e fatto ri-correre i seguito.
R un sistema ‘open source’ disponibile nei termini di una GPL, il che significa che è gratuito ma vi sono alcune restrizioni sulla sua ridistribuzione (non è di pubblico dominio).
R è scaricabile via Internet dal sito:
http://www.r-project.org/
Qui si trovano anche molti manuali e documenti.
Assegnazione
Si usa per creare variabili ‘simboliche’ in R o altri oggetti: la variabile è rappresentata dal suo nome. Questo permette di conservare e manipolare gli oggetti: altrimenti i valori vengono ‘stampati e persi’.
Può esser assegnato ad un oggetto un nome qualsiasi pur che non cominci con un numero. Un nome non può contenere spazi o underscore. Da evitare sono anche i nomi già usati da R (c, q, t, C, D, F, I, T, …). I nomi sono ‘case sensitive’ (A != a).
Come comando di assegnazione si può anche utilizzare il simbolo di uguaglianza “=”.
Gli oggetti creati nel corso della sessione o l’intera collezione degli oggetti temporaneamente disponibili nell’ambiente di lavoro (environment) possono essere salvati per, ad esempio, riprendere l’analisi ad una sessione successiva nel formato .RData. SI consiglia tuttavia di non procedere al salvataggio automatico dell’ambiente di lavoro.
R opera con strutture di dati a cui viene assegnato un nome. La più semplice di queste strutture è il vettore. Un vettore è una collezione ordinata di valori (argomenti) dello stesso tipo (numerici, caratteri, logici).
Il modo più semplice di creare un vettore è con la funzione ‘c( )’,dove c sta per “concatena”.
Alcuni esempi:
Vettori numerici
vect<-c(9, 8, 7, 6, 5, 4, 3, 2,1)Vettori di caratteri
vect2<-c("cane", "gatto", "lupo", "tasso")i caratteri vanno sempre scritti in R all’interno di virgolette (“) o (’)
Vettori logici
l’oggetto vect costruito sopra contiene numeri con il seguente comando chiediamo a R di verificare quali di questi numeri sono >5
vect > 5R restituisce come risultato un vettore logico con indicato TRUE quando il valore in vect è >5 e FALSE quando è < o = a 5. I vettori logici sono generati da condizioni. Il vettore logico generato dalla verifica della condizione ‘>5’ ha la stessa lunghezza di vect e per ogni elemento di vect viene restituito un valore TRUE se la condizione è verificata e FALSE se la condizione non è verificata. Gli operatori logici sono <, >, <=, >=, == (esattamente uguale) e != (disuguale). Inoltre, se A e B sono espressioni logiche, A & B è la loro intersezione (‘and’, ∩), A|B è la loro unione (‘or’, U), !A è la negazione di A (non A). I vettori logici possono essere trasformati in vettori numerici. Questo può avvenire attraverso una funzione tipo ‘as.integer(x)’ o in modo automatico, quando vengono applicate funzioni matematiche ad un oggetto di tipo logico. Con la coercizione TRUE viene interpretato come 1 e FALSE come 0.
y <- rnorm(20, mean=50, sd=20)
y < 20
sum(y < 20) # quanti elementi in y sono più piccoli di 20?Su vettori numerici si possono eseguire tutti i tipi di operazioni matematiche. Ad esempio:
sample<-c(475,550,380,610,490)
positivi<-c(276,314,232,365,304)
prevalenza <-100*positivi/sampleSi noti che l’operazione è fatta per ogni elemento dei vettori sample e positivi rispettando la sequenza per ottenere un nuovo vettore ( prevalenza); questa particolaritàù del calcolo di R è detta “vettorizzazione”, e permette di evitare i classici cicli for che si utilizzano normalmente nei linguaggi di programmazione quando è necessario reiterare la stessa procedura variando uno o più elementi.
Calcoliamo la media, utilizzando un vettore costurito tramite la funzione rnorm() che genera un vettore di numeri casuali che si distribuiscono con una distribuzione normale.
dati <- rnorm(100, 10, 2) # questa istruzione dice a R di generare 100 numeri estratti a caso
#da una distribuzione con media = 10 e dev st = 2 e di salvare il risultato nell'environment in un vettore di nome dati
length(dati) # questa istruzione dice a R di calcolare quanti valori ci sono nel vettore dati (lunghezza del vettore dati)
sum(dati) # questa istruzione dice a R di sommare tutti i valori presenti nel vettore dati
# le istruzioni date sopra produce dei risultati che sono volatili,
#non sono salvate nell'ambiente. Per fare la media data da somma/N,
#possiamo procedere sia salvando i due oggetti sopra assegnandogli
#un nome sia inserendo direttamente la formula, in questo caso avremo:
sum(dati)/length(dati)
# R esegue il comando è restitutisce il risultato. In base alle nostre necessità
#possiamo decidere di salvarlo o meno tramite l'assegnazione di un nome.
media <- sum(dati)/length(dati)sum() e length() sono funzioni. Le funzioni sono chiamate attraverso un nome ed operano sugli ‘argomenti’, che vengono scritti fra le parentesi.
R base è fornito di tutte le funzioni matematiche e statistiche di base, quindi ad esempio la media calcolata sopra può essere semplicemente ottenuta usando la funzione mean():
mean(dati)Spesso un dato puntuale non è disponibile (un campione smarrito, …) . In R un valore speciale identifica i dati mancanti: NA (‘not available’). Da notare che operazioni fatte su NA ritornano NA:
Y <- c(7, 4, 3, 6, 5, NA, 9)
mean(Y) # non è possibile fare la media di un vettore in cui è presente uno o più dati mancanti
mean(Y, na.rm = T) # aggiungendo l'argomento na.rm = T, R prima di calcolare la media rimuove il dato mancanteQuando il risultato di una operazione non è definibile R restituisce il valore NaN
0/0
Tidyverse è una raccolta di pacchetti open
source per il linguaggio di programmazione R introdotto da Hadley
Wickham e dal suo team che “condividono una filosofia di progettazione
sottostante, una grammatica e strutture di dati” ordinati o “tidy”.
Tra principali pacchetti sono:
dplyr, ggplot2, tidyr, tibble, readr, forecats, purr, stringr, lubridate
Il dettaglio dei singoli pacchetti, le funzionalità, le modalità d’uso sono ben descritte al sito di supporto del pacchetto a cui si rimanda (https://www.tidyverse.org/packages/)
In questo corso introduttivo e per le attività legate alla manipolazione, pulizia, dei dataset useremo principalmente il pacchetto dplyr e alcune funzioni del pacchetto lubridate che permette la gestione delle date.
Tidy data I dati ordinati sono un modo per descrivere i dati organizzati con una particolare struttura – una struttura rettangolare, in cui ogni variabile ha la propria colonna, e ogni osservazione ha la sua riga ( Wickham 2014 ).
Questa struttura standard di dati
ordinati ha portato Hadley Wickham a descriverlo nel modo in cui Leo
Tolstoy descrive le famiglie. Leo dice “ Le famiglie felici sono tutte
uguali; ogni famiglia infelice è infelice a modo suo ”. Allo stesso
modo, Hadley afferma che “ i set di dati ordinati sono tutti uguali, ma
ogni set di dati disordinato è a suo modo disordinato ”.
I dati contengono 12 variabili: numero di serie del passeggero ( PassengerId ), variabile di sopravvivenza del passeggero binario ( Survived ), classe di passeggeri (PClass ), nome (Name), genere ( , (Sex) età (Age), numero di fratelli e coniugi a bordo ( siblings and spouses on board ), numero di figli / genitori a bordo ( parent children on board ), numero di biglietto ( Tickett ), tariffa pagata (Fare), numero di cabina ( Cabin ) e lugo d’imbarco del passeggero ( Embarked).
Il comando select() permette di selezionare una o più variabili del dataframe. Per selezionare alcune colonne è sufficiente aggiungere i nomi delle variabili come argomenti di select. L’ordine in cui vengono aggiunti, determinerà l’ordine in cui verranno visualizzati nell’output.
È possibile creare nuove colonne utilizzando quelle del dataframe con la funzione mutate(). Le opzioni utilizzabili all’interno dell’istruzione sono quasi infinite: praticamente tutto ciò che si può fare per i vettori, può essere fatto all’interno della funzione mutate(). Solitamente per una nuova colonna si utilizza un nuovo nome ma se viene utilizzato il nome di una colonna già esistente essa viene sostituita.
In molti casi non si vogliono includere tutte le righe nell’analisi, ma solo una selezione. La funzione filter() riduce le righe/osservazioni in base alle condizioni assegnate, La sintassi generale del filtro è: filter(dataset, condizione). È possibile filtrare le variabili numeriche in base ai rispettivi valori. Gli operatori più utilizzati per questo sono:
1 > (maggiore)
2 >= (maggiore uguale)
3 < (minore)
4 <= (minore uguale)
5 == (uguale)
6 != (diverso)
Oppure per le variabile categoriche sono utilizzati i segni == o !=. Una o più condizioni possono essere usate contemporaneamente:
filter(iris, Species == “virginica”, Sepal.Width > 3.7)
La funzione slice() consente di selezionare le righe tramite la loro posizione:
slice(iris,8:12)
La funzione summarize() permette di calcolare funzioni statistiche riassuntive. Per utilizzare la funzione è sufficiente aggiungere il nome nuovo della colonna e, dopo il segno di uguale, la funzione matematica con cui vogliamo riassumere i dati column_name = funzione(variabile). È possibile aggiungere più funzioni di riepilogo all’interno dell’istruzione summarize().
Il codice seguente mostra il calcolo della funzione mean e sd in riferimento alla variabile Sepal.Length:
summarize(iris, mean_sl = mean(Sepal.Length), sd_sl= sd(Sepal.Length ))
La funzione viene utilizzata in successione al comando group_by() come verrà spiegato nella sezione split-apply-combine.
L’operatore pipe, %>% permette di concatenare facilmente una sequenza di funzioni. Quando la pipe è presente tra due funzioni esempio: fun1() %>% fun2() questa sequenza può essere tradotta con esegui fun1() poi, con con output di fun1(), esegui fun2(). Tale comando è mostrato nella sezione successiva in cui group_by() e summarize() sono usati in successione. Per richiamare l’operatore pipe dalla tastiera è possibile utilizzare la shortcut di RStudio: Ctrl + Shift + M (Windows), Cmd + Shift + M (Mac).
Molte delle attività di analisi dati possono essere affrontate utilizzando il paradigma “split-apply-combine”: dividere i dati in gruppi, applicare alcune analisi a ciascun gruppo e combinare i risultati in un nuovo data frame.
Il pacchetto dplyr è stato scritto appositamente per ottimizzare le analisi di tipo Split-Apply-Combine.
La funzione group_by() raggruppa i dati utilizzando i livelli di una variabile categorica ed è utilizzata insieme alla funzione summarize per fornire statistiche a riguardo i diversi gruppi. In questo esempio le funzioni sono concatenate con l’operatore %>%:
La funzione arrange() ordina le righe in modo crescente. Per ordinare in modo decrescente utilizzare la funzione desc() come mostrato nell’esempio:
Le funzioni join permettono di unire due tabelle tramite una o più colonne in comune. Quando si unisco due tabelle si definisce tabella di sinistra la prima tabella che viene codificata e tabella di destra la seconda. I nomi delle funzioni richiamano i respettivi comandi utilizzati in SQL.
left_join() : estrae tutti i valori della tabella a sinistra anche se non hanno corrispondenza nella tabella a destra;
right_join() estrae tutti i valori della tabella a destra anche se non hanno corrispondenza nella tabella di sinistra.
inner_join(): il suo scopo è quello di unire due tabelle restituendo un risultato combinato sulla base di uno o più osservazioni che trovano corrispondenza in tutte le tabelle coinvolte nella join. Il comando corrispondente è
full_join(): estrae tutte le righe delle due tabelle.
I test statistici sono modelli lineari
A work by Massimo Tranquillo